package com.atguigu.gmall.feign.product;

import com.atguigu.gmall.model.product.BaseCategoryView;
import com.atguigu.gmall.model.product.SkuImage;
import com.atguigu.gmall.model.product.SkuInfo;
import com.atguigu.gmall.model.product.SpuSaleAttr;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 项目扫描@FeignClient标注的接口时，扫描到多个接口中出现相同服务名会导致程序报错，出现问题的原因如下:
 * 1.SpringBoot启动的时候，如@EnableFeignClients(basePackages="com.atguigu.gmall.feign.product")指定了需要扫描的包，
 * SpringBoot就会自动扫描此包下的所有接口，并把他们作为feign接口，创建代理对象。
 * @FeignClient("service-product") 指定要调的远程微服务名。
 * feign、超时时间、重试次数。。。这些数据，都是以@FeignClient标注的名为单位
 * 这样扫描进去，相当于不同的FeignClient客户端，使用了同一个FeignConfig。
 *
 * 总结原因:一句话，SpringBoot感知到了com.atguigu.gmall.feign.product包下多个Feign客户端使用同一个名字，可能会配置冲突。默认报错
 * 解决办法:
 *   1.让相同服务名的Fegin客户端使用不同微服务名。（解决不了）
 *   2.所有同一个微服务的远程接口，都写在一个接口类上。(代码都揉在一起，不太好)
 *   3.在配置文件中加入:   spring.main.allow-bean-definition-overriding=true
 *
 */
@FeignClient("service-product")
@RequestMapping("/api/sku")
public interface SkuInfoFeignClient {

    @GetMapping("/detail/price/{skuId}")
    public BigDecimal getSkuPriceBySkuId(@PathVariable("skuId") Long skuId);

    @GetMapping("/info/{skuId}")
    public SkuInfo getSkuInfo(@PathVariable("skuId") Long skuId);

    @GetMapping("/image/{skuId}")
    public List<SkuImage> getSkuImages(@PathVariable("skuId") Long skuId);

    @GetMapping("/categoryView/{c3Id}")
    public BaseCategoryView getCategoryView(@PathVariable("c3Id") Long c3Id);

    @GetMapping("/saleattrs/{skuId}/{spuId}")
    public List<SpuSaleAttr>  getSpuSaleAttrBySkuIdAndSpuId(@PathVariable("skuId") Long skuId, @PathVariable("spuId") Long spuId);

    @GetMapping("/valuesSkuJson/{spuId}")
    public Map<String,String> getValuesSkuJson(@PathVariable("spuId") Long spuId);
}
